﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Data;

/// <summary>
/// Summary description for Chamados
/// </summary>
public class Chamado : Banco
{
    private string Sql;
    public Chamado()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    /// <summary>Adiciona no Banco de Dados um novo chamado</summary>
    /// <param name="solicitante">String do solicitante</param>
    /// <param name="reclamacao">String com a reclamação</param>
    /// <param name="tecnico">Int com o técnico, 0 para nenhum</param>
    /// <param name="situacao">Int com situação, 1 para inicial, 2 para andamento, 3 para finalizado</param>
    /// <param name="login_solicitante">String com o login</param>
    /// <param name="prioridade">Int com prioridade</param>
    /// <param name="assunto">String com assunto</param>
    /// <returns>True se for inserido com sucesso, false se houve alguma falha com o comando, banco ...</returns>
    public bool NovoChamado(string url, string solicitante, string reclamacao, int tecnico, int situacao, string login_solicitante, int prioridade, string assunto, string estacao)
    {
        //rotina para buscar data e hora do servidor
        string hora_abertura = DateTime.Now.ToString("HH:mm:ss");
        string data_abertura = DateTime.Now.ToString("yyyy/MM/dd");
        //string para adicionar no banco
        string ComandoChamado = "INSERT INTO chamados" +
        "(solicitante, reclamacao, data_abertura, hora_abertura, login_solicitante, assunto, Prioridade_codigo, Situacao_codigo, Tecnicos_codigo, estacao)" +
        "VALUES (" + solicitante + ",'" + reclamacao.Replace("\\", "\\\\") + "','" + data_abertura + "','" + hora_abertura + "','" + login_solicitante + "','" + assunto + "'," + prioridade + "," + situacao + ", " + tecnico + ",'" + estacao + "')";
     
        //executa o comando
        if (url == "")
        {
            return Comando(ComandoChamado);
        }
        else
        {
            if (Comando(ComandoChamado))
            {
                if (NovoAnexo(url, UltimoCodigo("SELECT LAST_INSERT_ID()")))
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
    }
    /// <summary>Cria um anexo no Banco de dados</summary>
    /// <param name="url">Pasta onde fica a imagem</param>
    /// <param name="chamado">Codigo do chamado para o anexo</param>
    /// <returns>True se for inserido com sucesso, false se houve alguma falha com o comando, banco ...</returns>
    public bool NovoAnexo(string url, int chamado)
    {
        string[] URL = url.Split(new char[] { '\\' });
        url = "../";
        for (int i = 2; i < URL.Length; i++)
        {            
                if (i < URL.Length - 1)
                    url = url + URL[i] + "/";
                else
                    url = url + URL[i];   
        }
        int anexo = Convert.ToInt32(UltimoCodigo("SELECT codigo FROM anexos ORDER BY codigo DESC LIMIT 1"))+1;
        string comando_Anexos = "INSERT INTO anexos (codigo, url_anexo) VALUES (" + anexo + ",'" + url + "')";
        string comando_ChamadosAnexos = "INSERT INTO chamados_has_anexos (Chamados_codigo, Anexos_codigo) VALUES (" + chamado + ", " + anexo + ")";
        if (Comando(comando_Anexos) && Comando(comando_ChamadosAnexos))
            return true;
           
        else
            return false;
    }
    /// <summary>
    /// Encerra os chamados no sistema
    /// </summary>
    /// <param name="CodigoChamado">Codigo do chamado a ser encerrado</param>
    /// <returns>Status do banco.</returns>
    public bool EncerrarChamado(int CodigoChamado)
    {
        return Comando("UPDATE chamados SET data_fechamento = '" + DateTime.Now.ToString("yyyy/MM/dd") + "', Situacao_codigo = 3, hora_fechamento = '" + DateTime.Now.ToString("HH:mm:ss") + "'  WHERE (chamados.codigo = " + CodigoChamado + ")");
    }
    /// <summary>
    /// Altera somente a solução do chamado.
    /// </summary>
    /// <param name="CodigoChamado">Codigo para ser alterado.</param>
    /// <param name="Solucao">Nova solução.</param>
    /// <returns>Status no banco.</returns>
    public bool AlterarSolucao(int CodigoChamado, string Solucao)
    {
        return Comando("UPDATE chamados SET solucao = '" + Solucao.Replace("\\", "\\\\") + "'  WHERE (codigo = " + CodigoChamado + ")");
    }
    /// <summary>
    /// Popula DropDownList com situações.
    /// </summary>
    /// <param name="Ddl">DropDownList a ser populada.</param>
    public void DropDownList(DropDownList Ddl)
    {
        DropDownList(Ddl, "SELECT codigo, descricao FROM situacao Where codigo <> 3");
    }
    /// <summary>
    /// Retorna DataTable com os chamados do banco ordenados por data.
    /// </summary>
    /// <returns>DataTable com todos chamados.</returns>
    public DataTable BuscarChamados()
    {
        return Busca_Banco("SELECT chamados.codigo AS Codigo, usuarios.nome AS Usuario, chamados.estacao AS Estacao, chamados.assunto AS Assunto, tecnicos.nome AS Tecnico, situacao.descricao AS Situacao, chamados.data_abertura AS DataAbertura FROM chamados INNER JOIN usuarios ON chamados.solicitante = usuarios.codigo INNER JOIN tecnicos ON chamados.Tecnicos_codigo = tecnicos.codigo INNER JOIN situacao ON chamados.Situacao_codigo = situacao.codigo ORDER BY chamados.data_abertura desc");
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Mes.
    /// </summary>
    /// <param name="Mes">Mes para filtra ex: 1 = janeiro; 2 = fevereiro</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadosMes(string Mes)
    {
        Sql = "SELECT chamados.codigo AS Codigo, usuarios.nome AS Usuario, chamados.estacao AS Estacao, chamados.assunto AS Assunto, tecnicos.nome AS Tecnico, "+
        "situacao.descricao AS Situacao, chamados.data_abertura AS DataAbertura FROM chamados INNER JOIN usuarios ON chamados.solicitante = usuarios.codigo INNER JOIN "+
        "tecnicos ON chamados.Tecnicos_codigo = tecnicos.codigo INNER JOIN situacao ON chamados.Situacao_codigo = situacao.codigo "+
        "WHERE (MONTH(chamados.data_abertura) = "+Mes+") ORDER BY DataAbertura DESC";
        return Busca_Banco(Sql);
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Ano.
    /// </summary>
    /// <param name="Ano">Ano em numeros --> 2011; 2010.</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadosAno(string Ano)
    {
        Sql = "SELECT chamados.codigo AS Codigo, usuarios.nome AS Usuario, chamados.estacao AS Estacao, chamados.assunto AS Assunto, tecnicos.nome AS Tecnico, " +
        "situacao.descricao AS Situacao, chamados.data_abertura AS DataAbertura FROM chamados INNER JOIN usuarios ON chamados.solicitante = usuarios.codigo INNER JOIN " +
        "tecnicos ON chamados.Tecnicos_codigo = tecnicos.codigo INNER JOIN situacao ON chamados.Situacao_codigo = situacao.codigo " +
        "WHERE (YEAR(chamados.data_abertura) = " + Ano + ") ORDER BY DataAbertura DESC";
        return Busca_Banco(Sql);
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Ano.
    /// </summary>
    /// <param name="Ano">Ano em numeros --> 2011; 2010.</param>
    /// <param name="Mes">Mes para filtra ex: 1 = janeiro; 2 = fevereiro</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadoAnoMes(string Ano, string Mes)
    {
        Sql = "SELECT chamados.codigo AS Codigo, usuarios.nome AS Usuario, chamados.estacao AS Estacao, chamados.assunto AS Assunto, tecnicos.nome AS Tecnico, " +
        "situacao.descricao AS Situacao, chamados.data_abertura AS DataAbertura FROM chamados INNER JOIN usuarios ON chamados.solicitante = usuarios.codigo INNER JOIN " +
        "tecnicos ON chamados.Tecnicos_codigo = tecnicos.codigo INNER JOIN situacao ON chamados.Situacao_codigo = situacao.codigo " +
        "WHERE (YEAR(chamados.data_abertura) = " + Ano + ") AND (MONTH(chamados.data_abertura) = " + Mes + ") ORDER BY DataAbertura DESC";
        return Busca_Banco(Sql);
    }
    /// <summary>
    /// Busca todos chamados.
    /// </summary>
    /// <returns>DataTable com chamados.</returns>
    public DataTable TodosChamados()
    {
        Sql = "SELECT chamados.codigo AS Codigo, usuarios.nome AS Usuario, chamados.estacao AS Estacao, chamados.assunto AS Assunto, tecnicos.nome AS Tecnico, " +
            "situacao.descricao AS Situacao, chamados.data_abertura AS DataAbertura FROM chamados INNER JOIN usuarios ON chamados.solicitante = usuarios.codigo INNER JOIN " +
            "tecnicos ON chamados.Tecnicos_codigo = tecnicos.codigo INNER JOIN situacao ON chamados.Situacao_codigo = situacao.codigo " +
            "ORDER BY DataAbertura DESC";
        return Busca_Banco(Sql);
    }
}